// JSON是JavaScript Object Notation的缩写，它是一种数据交换格式
// JSON实际上是JavaScript的一个子集
// 在JSON中，一共就这么几种数据类型
// number：和JavaScript的number完全一致
// boolean：就是JavaScript的true或false
// string：就是JavaScript的string
// null：就是JavaScript的null
// array：就是JavaScript的Array表示方式——[]
// object：就是JavaScript的{ ... }表示方式

// JSON规定字符集必须是UTF-8解决了多语言的问题,字符串必须用"",Object的键也必须用""

//首先是将javascript对象序列化为一个JSON格式的字符串，这样就能通过网络传递给其他计算机
//其他计算机收到一个JSON格式字符串就能将其反序列化为JS对象，就可以在JavaScript中直接使用这个对象了


//序列化
var xiaoming = {
    name: '小明',
    age: 14,
    gender: true,
    height: 1.65,
    grade: null,
    'middle-school': '\"W3C\" Middle School',
    skills: ['JavaScript', 'Java', 'Python', 'Lisp']
};

var s=JSON.stringify(xiaoming,null, '  '); //加上参数 输出的好看点
console.log(s);
// 第二个参数的含义是
// An array of strings and numbers that acts as a approved list for selecting the object 
// properties that will be stringified. 用来筛选对象的键值，指定特定的属性传入一个array

//第二个参数还可以是函数
function convert(key, value) {
    if (typeof value === 'string') {
        return value.toUpperCase();
    }
    return value;
}

JSON.stringify(xiaoming, convert, '  '); //先将代码中所有的属性值都变成大写

// 精确控制序列化， 定义一个toJSON()的方法 ， 直接返回JSON应该序列化的数据
var xiaoming = {
    name: '小明',
    age: 14,
    gender: true,
    height: 1.65,
    grade: null,
    'middle-school': '\"W3C\" Middle School',
    skills: ['JavaScript', 'Java', 'Python', 'Lisp'],
    toJSON: function () {
        return { // 只输出name和age，并且改变了key：
            'Name': this.name,
            'Age': this.age
        };
    }
};

JSON.stringify(xiaoming); // '{"Name":"小明","Age":14}'



//反序列化 拿到一个JSON格式的字符串使用JSON.parse()把它变成一个Javascript对象
JSON.parse('[1,2,3,true]'); // [1, 2, 3, true]
JSON.parse('{"name":"小明","age":14}'); // Object {name: '小明', age: 14}
JSON.parse('true'); // true
JSON.parse('123.45'); // 123.45

//还可以接受一个函数 用来转换解析出的属性
var obj = JSON.parse('{"name":"小明","age":14}', function (key, value) {
    if (key === 'name') {
        return value + '同学';
    }
    return value;
});
console.log(JSON.stringify(obj)); // {name: '小明同学', age: 14}

